#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>


typedef struct mouvement mouvement;        //structure de mouvement
struct mouvement
{
    int gauche;        //gauche=1 : il y a un mouvement vers la gauche //gauche=0 : il n'y a pas de mouvement vers la gauche
    int droite;        //droite=1 : il y a un mouvement vers la droite //droite=0 : il n'y a pas de mouvement vers la droite
    int sgauche ;
    int sdroite;
};





Uint8 r,g,b,r1,g1,b1,r2,g2,b2,r3,g3,b3,r4,g4,b4;


void getPixelColor(int x, int y, SDL_Surface *map,Uint8 *r,Uint8 *g,Uint8 *b)
{
 
    if(x>0 && y>0 && x<map->w && y<map->h)
    {
        int bpp = map->format->BytesPerPixel;
      
        Uint8 *p = (Uint8 *)map->pixels + y * map->pitch + x * bpp;
        SDL_GetRGB(*(Uint32 *)p,map->format, r, g, b);
 
    }
/* else // sinon on renvoie noir, pour éviter de planter dans certains cas
    {
        r = 255;
        g = 255;
        b = 255;
    }
   // printf("r=%u\n",r);*/
}











void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )
{
    //Holds offsets
    SDL_Rect offset;

    //Get offsets
    offset.x = x;
    offset.y = y;

    //Blit
    SDL_BlitSurface( source, NULL, destination, &offset );
}

int main ( int argc, char** argv )
{
	 mouvement mvt_bonhomme;
	//Initialisation des structures
    mvt_bonhomme.gauche = 0;
    mvt_bonhomme.droite = 0;
    //Init de la SDL
    SDL_Init( SDL_INIT_VIDEO );

    // On crée une fenêtre
    SDL_Surface* ecran = SDL_SetVideoMode(1000, 610, 16, SDL_HWSURFACE|SDL_DOUBLEBUF);

    // On charge le fond
    SDL_Surface* fond = IMG_Load("fond.jpg");

    //On charge Mario
    SDL_Surface* mario = IMG_Load("5.png");
SDL_SetColorKey(mario , (SDL_SRCCOLORKEY | SDL_RLEACCEL), SDL_MapRGB(mario->format,255, 255, 255));

    // La position du fond
   int Xf =0, Yf=0;

    // La position de Mario
  
    int Xm = 100;
    int Ym = 600-(mario->h);

    // Les variables de la troisieme methode
    double v_x = 1.5;

    double v_grav = 1;
    double v_saut = -20;

    double v_y = v_saut;

    // Boucle principale
    int fin = 0,saut=0,g,d,i=100;
SDL_EnableKeyRepeat(4,4);
    while (!fin)
    {
        // Gestion des evenements
        SDL_Event event;
        while (SDL_PollEvent(&event))
        {
            switch (event.type)
            {
            case SDL_QUIT:
                fin = 1;
                break;

            case SDL_KEYDOWN:
                { switch(event.key.keysym.sym)    //On regarde quelle est la touche sur laquelle on a appuyé
	                {

		    case SDLK_RIGHT: 
                        mvt_bonhomme.droite = 1;  
			mvt_bonhomme.sdroite = 1 ;
			mvt_bonhomme.sgauche = 0 ;                 
                        mvt_bonhomme.gauche = 0; 
i++;
			d=1;
			g=0;
			Xf-=5;
if( Xf <=640 -fond->w )
        {
            //Reset the offset
            Xf = 0;
        }

                        break;
                    case SDLK_LEFT: 
                        mvt_bonhomme.gauche = 1;                   
                        mvt_bonhomme.droite = 0; 
			mvt_bonhomme.sdroite = 0 ;
			mvt_bonhomme.sgauche = 1 ;                   
			g=1;
			d=0;			
			   Xf+=20;        
/*if( Xf <= fond->w )
        {
            //Reset the offset
            Xf = 0;
        }
  */       
			break;
		    case SDLK_UP:
			saut=1;
			break;
			}	
                }
		break;
		case SDL_KEYUP:
                	switch(event.key.keysym.sym)    
                {
                    case SDLK_RIGHT: // La flèche droite est relachée
                        mvt_bonhomme.droite = 0;        //On remet la variable à 0 pour empêcher le déplacement
                        break;
                    case SDLK_LEFT: // La flèche gauche est relachée
                        mvt_bonhomme.gauche = 0;        //On remet la variable à 0 pour empêcher le déplacement
                        break;
                }
                break;
            }
        }



if (mvt_bonhomme.droite== 1)
{

if (i%3==0) { mario = IMG_Load("3.png");}
else if (i%3==1) { mario = IMG_Load("2.png");}
else if  (i%3==2) { mario = IMG_Load("1.png");}
Xm = Xm+ v_x +v_x;
//Xm+=0.1;
}

if (mvt_bonhomme.gauche== 1)
{

Xm = Xm - v_x - v_x;
}


if (saut==1)
{	
        // EVOLUTION
 Xm+=2;//////////////////////////////////////////////////////////////////////////////////////////////////////////
            // Evolution des positions : vive la rigueur !
            if (d == 1)
	{
	    Xm += v_x;
            Ym += v_y;
	}
	else if (g== 1 ) {
Xm -= v_x;
Ym += v_y;
}
else {Ym += v_y;}
            // evolution de la vitesse verticale
            v_y += v_grav;
	
	    if (Ym > 600-(mario->h))
		{
		d=0;
		g=0;
		saut=0;	
		v_y = v_saut;
                
		}
Xf-=5;
if( Xf <=640 -fond->w )
        {
            //Reset the offset
            Xf = 0;
        }

        // FIN EVOLUTION

        // DESSIN

       
	
    }
 r= 150;
	g= 150;
	b=150;
  getPixelColor(Xm,Ym, ecran,&r1,&g1,&b1);
getPixelColor(Xm+mario->w,Ym, ecran,&r2,&g2,&b2);
getPixelColor(Xm+mario->w,Ym+mario->h, ecran,&r3,&g3,&b3);
getPixelColor(Xm,Ym+mario->h, ecran,&r4,&g4,&b4);
 if(((r1>=10&&r1<=20)  &&( g1>=230 && g1<=250)  && (b1>= 230 && b1<=250  )) || ((r2>=10&&r<=20)  &&( g2>=230 && g2<=250)  && (b2>= 230 && b2<=250  )) || ((r3>=10&&r3<=20)  &&( g3>=230 && g3<=250)  && (b3>= 230 && b3<=250  )) || ((r4>=10&&r4<=20)  &&( g4>=230 && g4<=250)  && (b4>= 230 && b4<=250  )))
                                {
                                    Xm=0;
                                }



 SDL_FillRect(ecran, 0, SDL_MapRGB(ecran->format, 0, 0, 0));
apply_surface(Xf, Yf, fond, ecran);
apply_surface(Xm, Ym, mario, ecran);
SDL_Flip(ecran);	

}


    // Et on soulage la mémoire !
    SDL_FreeSurface(fond);
    SDL_FreeSurface(mario);

    SDL_Quit();

    return 0;
}
